home *** CD-ROM | disk | FTP | other *** search
/ MacFormat UK 179 / MF_UK_179_1.iso / DiscContents / In the mag / Widgets / PEMDAS 1.0 / PEMDAS / PEMDAS.wdgt / calculationHandler.js < prev    next >
Encoding:
Text File  |  2006-12-12  |  6.0 KB  |  219 lines

  1.  
  2. function updateAnswerCache(answer)
  3. {
  4. setVariable('ans', answer);
  5. if (arguments.length===1) {
  6. while (getVariableIndex('ans'+currentAnswerNumber)!=-1) {
  7. currentAnswerNumber++;
  8. }
  9. setVariable('ans'+currentAnswerNumber, answer);
  10. currentAnswerNumber++;
  11. }
  12. }
  13. function setVariableInCacheDisplay(answerToDisplay, answerName)
  14. {
  15. if ((answerToDisplay.toString()).length>9)
  16. answerToDisplay=answerToDisplay.toPrecision(5);
  17. if (commaLocale) {
  18. answerToDisplay=answerToDisplay.toString();
  19. answerToDisplay=answerToDisplay.replace('.',',');
  20. }
  21. if (document.getElementById('cache'+answerName)) {
  22. document.getElementById('cache'+answerName).innerHTML=answerName+'= '+answerToDisplay;
  23. } else {
  24. variableCacheDiv.innerHTML+="<div id='cache"+answerName+"' class='variableCacheVariableDiv' onclick=\"addVariableToMainDisplay('"+answerName+"');\">"+ answerName +'= '+answerToDisplay+'</div>';
  25. }
  26. updateVariableCacheDivScrollArea();
  27. }
  28. function formatWithGlobalPrecision(number)
  29. {
  30. if (preferencesPrecision && (number.toString()).length>preferencesPrecision) {
  31. number=parseFloat(number);
  32. number=number.toPrecision(preferencesPrecision);
  33. }
  34. return number;
  35. }
  36. function formatAnswerForLocale(answerString)
  37. {
  38. if (commaLocale) {
  39. answerString=answerString.toString(); 
  40. answerString=answerString.replace(/,/g,' ');
  41. answerString=answerString.replace(/\./g,',');
  42. }    
  43. return answerString;
  44. }
  45. function formatAnswerForDisplay()
  46. {
  47. var masterNumber=arguments[0];
  48. var currentFSE=preferencesAnswerFormatting; 
  49. if (arguments.length==2)
  50. currentFSE=arguments[1];
  51. masterNumber=masterNumber.toString();
  52. var decimalLocation, formattedNumber, decimal, baseNumberLength, baseNumber, engFrontLength, formattedAfterDecimal; 
  53. var exponent=0, negativeSign='', exponentFound=false, i=0;
  54. if (masterNumber.search('e')!=-1) {
  55. exponentFound=true;
  56. baseNumber=masterNumber.substring(0, masterNumber.indexOf("e"));
  57. exponent=parseInt(masterNumber.substring(masterNumber.indexOf("e")+1));
  58. } else {
  59. baseNumber=masterNumber;
  60. exponent=0;
  61. }
  62. if (baseNumber=="0") {
  63. return "0";
  64. decimalLocation=baseNumber.indexOf('.');
  65. if (decimalLocation!=-1) {
  66. formattedAfterDecimal=getRidOfDoublePrecisionErrors(baseNumber.substring(decimalLocation+1));
  67. if (formattedAfterDecimal=="0") { 
  68. baseNumber=parseInt(baseNumber.substring(0, decimalLocation))+1;
  69. baseNumber=baseNumber.toString();
  70. } else if (formattedAfterDecimal=="") {
  71. baseNumber=baseNumber.substring(0, decimalLocation);
  72. } else { 
  73. baseNumber=baseNumber.substring(0, decimalLocation)+'.'+formattedAfterDecimal;
  74. }
  75. }
  76. if (currentFSE===1) { 
  77. if (exponentFound)
  78. return baseNumber+'e'+exponent;
  79. else {
  80. if (preferencesThousandsSeperators) {
  81. return formatWithThousandsSeperators(baseNumber);
  82. } else {
  83. return baseNumber;
  84. }
  85. }
  86. }
  87. if (baseNumber.charAt(0)=='-') { 
  88. negativeSign='-';
  89. baseNumber=baseNumber.substr(1);
  90. }
  91. if (baseNumber.indexOf(".")!=-1) {
  92. decimalLocation=baseNumber.indexOf('.');
  93. baseNumber=baseNumber.replace(/\./,'');
  94. exponent=exponent+decimalLocation-baseNumber.length;
  95. while (baseNumber.charAt(i++)=='0');
  96. baseNumber=baseNumber.substring(i-1);
  97. }
  98. switch(currentFSE) {
  99. case 2: 
  100. if (baseNumber.length=="1")
  101. formattedNumber=baseNumber+'.e'+exponent; 
  102. else {
  103. exponent=exponent+baseNumber.length-1;
  104. formattedNumber=baseNumber.charAt(0)+'.'+baseNumber.substr(1)+'e'+exponent;
  105. }
  106. break;
  107. case 3: 
  108. baseNumberLength=baseNumber.length;
  109. engFrontLength=(baseNumber.length+exponent)%3;
  110. if (!engFrontLength) 
  111. engFrontLength=3;
  112. else if (engFrontLength<0) 
  113. engFrontLength+=3;
  114. while (baseNumber.length<engFrontLength)
  115. baseNumber=baseNumber+'0';
  116. exponent=exponent+baseNumberLength-engFrontLength;
  117. if (baseNumberLength<engFrontLength)
  118. formattedNumber=baseNumber+'e'+exponent;
  119. else
  120. formattedNumber=baseNumber.substring(0,engFrontLength)+'.'+baseNumber.substring(engFrontLength)+'e'+exponent;
  121. break;
  122. }
  123. formattedNumber=negativeSign+''+formattedNumber;
  124. return formattedNumber;
  125. }
  126. function formatWithThousandsSeperators(number)
  127. {
  128. number=number.toString();
  129. var front=number, back='', correction, newFront='';
  130. if (number.indexOf('.')!=-1) {
  131. front=number.substring(0, number.indexOf('.'));
  132. back=number.substring(number.indexOf('.'));
  133. }
  134. if (front.length<4)
  135. return number;
  136. correction=3-(front.length)%3;
  137. for (i=0; i<front.length; i++) {
  138. if (i && !((i+correction)%3)) {
  139. newFront=newFront+','+front.charAt(i);
  140. } else {
  141. newFront=newFront+''+front.charAt(i);
  142. }
  143. }
  144. number=newFront+''+back;
  145. return number;
  146. }
  147. function formatBinaryNumber(binaryNumber)
  148. {    
  149. var i, formattedBinaryNumber='', binaryLength, binaryModulus;
  150. if (parseInt(binaryNumber)<0)
  151. return 'Error, less than 0';
  152. binaryNumber=binaryNumber.toString();
  153. binaryLength=binaryNumber.length;
  154. binaryModulus=4-binaryLength%4;
  155. if (binaryModulus!=4) {
  156. for (i=0; i<binaryModulus; i++) {
  157. binaryNumber='0'+binaryNumber;
  158. }
  159. }
  160. binaryLength-=4;
  161. for (i=0; i<binaryLength; i+=4) {
  162. formattedBinaryNumber=formattedBinaryNumber+binaryNumber.substr(i,4) + ' ';
  163. }
  164. formattedBinaryNumber=formattedBinaryNumber+''+binaryNumber.substr(i,4);
  165. return formattedBinaryNumber;
  166. }
  167. function formatHexNumber(hexNumber)
  168. {    
  169. return '0x'+hexNumber;
  170. }
  171. function formatOctNumber(octNumber)
  172. {    
  173. return '0'+octNumber;
  174. }
  175. function formatPercentNumber(percentNumber)
  176. {    
  177. return percentNumber+'%';
  178. }
  179. function getRidOfDoublePrecisionErrors(number)
  180. {
  181. var bleh=parseInt(number, 10);
  182. var stringNumber=number.toString();
  183. var leadingZeros, i;
  184. var replaceRegEx=new RegExp('9{6,}\\d{1,3}\\z');
  185. var searchResults=stringNumber.search(replaceRegEx);
  186. if (searchResults!=-1 && searchResults!==0) { 
  187. i=0;
  188. while (stringNumber.charAt(i++)=='0');
  189. i--;
  190. leadingZeros=i;
  191. if (leadingZeros) {
  192. bleh=parseInt(number.substring(leadingZeros), 10);
  193. searchResults-=leadingZeros;
  194. }
  195. number=bleh.toPrecision(searchResults);
  196. stringNumber=number.toString();
  197. searchResults=stringNumber.indexOf('e');
  198. if (searchResults!=-1) {
  199. number=stringNumber.substring(0, searchResults);
  200. number=number.replace('.','');
  201. }
  202. for (i=0; i<leadingZeros; i++) {
  203. number='0'+number;
  204. }
  205. return number;
  206. } else if (searchResults===0) { 
  207. number='0';
  208. return number;
  209. }
  210. replaceRegEx=new RegExp('0{6,}\\d{1,3}\\z');
  211. searchResults=stringNumber.search(replaceRegEx);
  212. if (searchResults!=-1) { 
  213. number = stringNumber.substring(0, searchResults);
  214. return number;
  215. }
  216. return number;
  217. }
  218.